package com.ark.cloud.dataservices.modules.sys.service;

import com.ark.cloud.dataservices.modules.sys.entity.form.PassWordForm;
import com.ark.cloud.dataservices.modules.sys.entity.param.UserQueryParam;
import com.ark.cloud.dataservices.modules.sys.entity.po.Module;
import com.ark.cloud.dataservices.modules.sys.entity.po.User;
import com.ark.cloud.dataservices.modules.sys.entity.vo.UserVo;
import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UsernameNotFoundException;

import java.util.List;
import java.util.Set;

public interface IUserService extends IService<User> {
    /**
     * 获取用户
     *
     * @param id 用户id
     * @return UserVo
     */
    UserVo get(String id);

    /**
     * 根据用户唯一标识获取用户信息
     *
     * @param uniqueId 用户唯一标识
     * @return {@link User}
     */
    User getByUniqueId(String uniqueId);

    /**
     * 新增用户
     *
     * @param user {@link User}
     * @return 是否添加成功
     */
    boolean add(User user);

    /**
     * 查询用户
     *
     * @return {@link UserVo}
     */
    IPage<UserVo> query(Page<User> page, UserQueryParam userQueryParam);

    /**
     * 更新用户信息
     *
     * @param user {@link User}
     * @return 是否更新成功
     */
    boolean update(User user);

    /**
     * 根据id删除用户
     *
     * @param id 用户 id
     */
    boolean delete(String id);

    /**
     * 修改密码
     *
     * @param passWordForm {@link PassWordForm}
     * @return 是否修改成功
     */
    boolean alterPassword(PassWordForm passWordForm);

    /**
     * 获取当前登录用户信息
     *
     * @param username 用户名
     * @return {@link User}
     */
    User queryUserInfo(String username);

    /**
     * 根据用户名更新用户
     *
     * @param user {@link User}
     * @return 是否更新成功
     */
    boolean updateUserByUsername(User user);

    UserDetails loadUserByUsername(String username) throws UsernameNotFoundException;

    /**
     * 根据用户 id 获取用户
     *
     * @param userId 用户 id
     * @return {@link User}
     */
    User getByUserId(String userId);

    /**
     * 获取所有用户
     *
     * @return {@link User}
     */
    List<User> all();

    /**
     * 根据席位 id 列表向 用户 - 席位表 中添加数据
     *
     * @param id      用户 id
     * @param seatIds 席位 id 列表
     * @return 是否添加成功
     */
    boolean addSeatsToUserBySeatIds(String id, Set<String> seatIds);

    /**
     * 根据用户名获取其可访问的模块集合
     *
     * @param username 用户名
     * @return {@link Module}
     */
    Set<Module> getModulesByUsername(String username);

    /**
     * 根据用户名获取席位 ip 集合
     *
     * @param username 用户名
     * @return 席位 ip 集合
     */
    Set<String> getSeatIpsByUsername(String username);
}
